home *** CD-ROM | disk | FTP | other *** search
- /*
- * SFtoSpr - Star Fighter 3000 graphics converter
- * Iconbar icon
- * Copyright (C) 2000 Chris Bazley
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public Licence as published by
- * the Free Software Foundation; either version 2 of the Licence, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public Licence for more details.
- *
- * You should have received a copy of the GNU General Public Licence
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
-
- /* ANSI library files */
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdbool.h>
-
- /* RISC OS library files */
- #include "kernel.h"
- #include "swis.h"
- #include "toolbox.h"
- #include "event.h"
- #include "iconbar.h"
-
- /* My library files */
- #include "err.h"
- #include "msgtrans.h"
- #include "Macros.h"
- #include "Loader.h"
- #include "SprFormats.h"
- #include "SFformats.h"
- #include "ViewsMenu.h"
- #include "nobudge.h"
- #include "hourglass.h"
-
- /* Local headers */
- #include "Main.h"
- #include "Utils.h"
- #include "SaveSprites.h"
- #include "SavePlanets.h"
- #include "SaveMapTiles.h"
- #include "SaveDir.h"
- #include "SFIconbar.h"
- #include "SFgfxconv.h"
-
- static ObjectId Iconbar_id = NULL_ObjectId, oldbox = NULL_ObjectId;
-
- /* ----------------------------------------------------------------------- */
- /* Function prototypes */
-
- static ToolboxEventHandler _Iconbar_clickhandler;
-
- static LoaderFinishedHandler planetfile_loadedhandler, tilefile_loadedhandler, spritefile_loadedhandler, dir_loadedhandler;
- static void check_dup_savebox(char *file_path, bool data_saved);
- static void open_new_savebox(ObjectId savebox);
-
- /* ----------------------------------------------------------------------- */
- /* Public functions */
-
- void Iconbar_initialise(ObjectId id)
- {
- Iconbar_id = id;
-
- /* Listen for SELECT clicks */
- EF(event_register_toolbox_handler(id, Iconbar_Clicked, _Iconbar_clickhandler, NULL));
-
- /* Register listeners for files dropped on iconbar icon */
- EF(loader_register_listener(LISTENER_SPRITEAREAS, FILETYPE_SPRITE, id, NULL, load_sprites, spritefile_loadedhandler, NULL));
- EF(loader_register_listener(0, FILETYPE_PLANETS, id, NULL, load_compressed, planetfile_loadedhandler, NULL));
- EF(loader_register_listener(0, FILETYPE_MAPTILES, id, NULL, load_compressed, tilefile_loadedhandler, NULL));
- EF(loader_register_listener(LISTENER_FILEONLY, FILETYPE_DIR, id, NULL, NULL, dir_loadedhandler, NULL));
- EF(loader_register_listener(LISTENER_FILEONLY, FILETYPE_APP, id, NULL, NULL, dir_loadedhandler, NULL));
- }
-
- /* ----------------------------------------------------------------------- */
- /* Private functions */
-
- static int _Iconbar_clickhandler(int event_code, ToolboxEvent *event, IdBlock *id_block, void *handle)
- {
- /* Bring all open windows to front */
- RE(ViewsMenu_showall());
-
- return 1; /* claim event */
- }
-
- /* ----------------------------------------------------------------------- */
-
- static void planetfile_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
- {
- check_dup_savebox(file_path, data_saved);
-
- /* Convert planets > sprites */
- spriteareaheader *sprite_area;
- bool success = planets_to_sprites((SF_PlanetsSetHdr **)buffer, &sprite_area);
- flex_free(buffer);
- if(success == false)
- return;
-
- /* Open sprites savebox */
- ObjectId newbox = SaveSprites_create(file_path, data_saved, &sprite_area, NULL);
- if(newbox == NULL_ObjectId) {
- flex_free((flex_ptr)&sprite_area);
- return;
- }
-
- open_new_savebox(newbox);
- }
-
- /* ----------------------------------------------------------------------- */
-
- static void tilefile_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
- {
- check_dup_savebox(file_path, data_saved);
-
- /* Convert tiles > sprites */
- spriteareaheader *sprite_area;
- if(tiles_to_sprites((SF_MapTilesSetHdr **)buffer, &sprite_area) == false) {
- flex_free(buffer);
- return;
- }
-
- /* Open sprites savebox */
- ObjectId newbox = SaveSprites_create(file_path, data_saved, &sprite_area, (SF_MapTilesSetHdr **)buffer);
- flex_free(buffer);
- if(newbox == NULL_ObjectId) {
- flex_free((flex_ptr)&sprite_area);
- return;
- }
-
- open_new_savebox(newbox);
- }
-
- /* ----------------------------------------------------------------------- */
-
- static void spritefile_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
- {
- bool found_pla, found_tile;
- ObjectId newbox;
-
- /* Verify sprite area we will be generating output from */
- if(verify_spriteareas) {
- nobudge_register(256);
- _kernel_oserror *errptr = _swix(OS_SpriteOp, _INR(0,1), SPRITEOP_VERIFY_AREA + SPRITEOP_USERAREA_SPRNAME, *buffer);
- nobudge_deregister();
- if(errptr != NULL) {
- err_report(errptr->errnum, errptr->errmess);
- flex_free(buffer); /* discard sprites */
- return;
- }
- }
-
- /* Try to guess whether to convert sprites to planets or tiles */
- found_tile = contains_valid_tiles((spriteareaheader **)buffer);
- found_pla = contains_valid_planets((spriteareaheader **)buffer);
- if(found_pla && found_tile) {
- flex_free(buffer); /* discard sprites */
- M_RET("AutoDouble");
- }
- if(!found_pla && !found_tile) {
- flex_free(buffer); /* discard sprites */
- M_RET("AutoNoMatch");
- }
-
- check_dup_savebox(file_path, data_saved);
-
- if(found_pla) {
- /* Convert sprites > planets */
- SF_PlanetsSetHdr *planets;
- bool success = sprites_to_planets((spriteareaheader **)buffer, &planets, false);
- flex_free(buffer);
- if(success == false)
- return;
-
- /* Create planets file savebox */
- newbox = SavePlanets_create(file_path, data_saved, &planets);
- if(newbox == NULL_ObjectId) {
- flex_free((flex_ptr)&planets);
- return;
- }
-
- } else {
- /* Convert sprites > tiles */
- SF_MapTilesSetHdr *tiles;
- bool success = sprites_to_tiles((spriteareaheader **)buffer, &tiles, false);
- flex_free(buffer);
- if(success == false)
- return;
-
- /* Load accompanying animations textfile, if any */
- if(data_saved) {
- #ifndef OLD_SCL_STUBS
- char anifilename[strlen(file_path)+4+1];
- #else
- char *anifilename = malloc(strlen(file_path)+4+1);
- if(anifilename == NULL)
- MG("NoMem");
- else {
- #endif
- sprintf(anifilename, "%s/ani", file_path);
- _kernel_oserror *errptr = load_animsfilepath(anifilename, &tiles, false);
- if(errptr != NULL)
- err_report(errptr->errnum, errptr->errmess);
- #ifdef OLD_SCL_STUBS
- }
- free(anifilename);
- #endif
- }
-
- /* Create tiles file savebox */
- newbox = SaveMapTiles_create(file_path, data_saved, &tiles);
- if(newbox == NULL_ObjectId) {
- flex_free((flex_ptr)&tiles);
- return;
- }
- }
- open_new_savebox(newbox);
- }
-
- /* ----------------------------------------------------------------------- */
-
- static void dir_loadedhandler(char *file_path, bool data_saved, flex_ptr buffer, int filetype, void *handle)
- {
- check_dup_savebox(file_path, data_saved);
-
- /* Create an output dialogue for a new batch operation */
- ObjectId newbox = SaveDir_create(file_path);
-
- if(newbox != NULL_ObjectId)
- open_new_savebox(newbox);
- }
-
- /* ----------------------------------------------------------------------- */
-
- static void check_dup_savebox(char *file_path, bool data_saved)
- {
- /* Check for existing dialogues */
- if(!multi_saveboxes)
- oldbox = last_savebox;
- else {
- if(data_saved)
- oldbox = ViewsMenu_findview(file_path);
- else
- oldbox = NULL_ObjectId;
- }
- }
-
- /* ----------------------------------------------------------------------- */
-
- static void open_new_savebox(ObjectId savebox)
- {
- /* Open savebox */
- RE(open_above_iconbar(0, savebox, Iconbar_id, NULL_ComponentId));
- last_savebox = savebox;
-
- /* Remove any old savebox (same filepath or only one at a time allowed) */
- if(oldbox != NULL_ObjectId)
- RE(toolbox_hide_object(0, oldbox)); /* will delete self when ready */
- }
-